package PersistenciaDAOs;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;

import logica.ConexionBD;
import logica.Partida;
import SQLQrys.QrysJugador;
import SQLQrys.QrysPartida;
import VOs.VOPartida;
import exceptions.PersistenciaException;


public class DAOPartida {
	private ConexionBD DBC;

	
	public void insert(Partida Par, String idMap) throws PersistenciaException{
		String ins=null;
		try {
			
			QrysPartida con = new QrysPartida();
			ins=con.insertPartida();
			PreparedStatement pstmt1;
			DBC=new ConexionBD();
			pstmt1 = DBC.getConnection().prepareStatement(ins);

			pstmt1.setInt(1, Par.getId());
			pstmt1.setInt(2, Par.getIdJugador1());
			pstmt1.setInt(3, Par.getIdJugador2());
			pstmt1.setInt(4, Par.getIdGanador());
			pstmt1.setInt (5, Integer.parseInt(idMap));

			pstmt1.executeUpdate();
			//cierro preparedStatement.
			pstmt1.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenciaException("Se ha producido un error al intentar guardar la partida");
		}finally{
			DBC.desconectar();
		}	
	}
	
	public Partida select(int idPart){
		String sel=null;
		
		Partida Par = new Partida();
		
		try{
			QrysPartida cons=new QrysPartida();
			
			sel = cons.selectPartida();
			//creo preparedStatement, seteo parametros y ejecuto la consulta.
			PreparedStatement pstmt1;

			DBC=new ConexionBD();

			pstmt1 = DBC.getConnection().prepareStatement(sel);
			pstmt1.setInt(1, idPart);
			
			ResultSet rs = pstmt1.executeQuery();
			while(rs.next()){
				Par.setId(rs.getInt("id"));
				Par.setFecha(rs.getDate("fecha"));
				Par.setIdJugador1(rs.getInt("mercante"));
				Par.setIdJugador2(rs.getInt("pirata"));
				Par.setIdGanador(rs.getInt("id_ganador"));
				Par.setIdMapa(rs.getInt("id_mapa"));
			}	
			
			rs.close();
			pstmt1.close();
	}
		catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenciaException("Se ha producido un error al intentar levantar la partida");
			}finally{
				DBC.desconectar();
				return Par;
				}	
			}

	
	public int maxIdP(){

		String sel="";
		int maxId = 0;
		try{
			
			DBC=new ConexionBD();

			QrysPartida cons=new QrysPartida();
			sel = cons.selectMaxId();
			PreparedStatement pstmt1;

			pstmt1 = DBC.getConnection().prepareStatement(sel);

			ResultSet rs = pstmt1.executeQuery();
			while(rs.next()){
				maxId = rs.getInt("maxId");
			}	
			
			rs.close();
			pstmt1.close();
			
		}catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenciaException("Se ha producido un error al intentar buscar la partida");
			}finally{
				DBC.desconectar();
				return maxId;
				}	
		}

	
	public String getPartidasJug(int idJug){
		String sel=null, partidas = "";
		
		try{
			QrysPartida cons=new QrysPartida();
			
			sel = cons.selectIdsPartJug();
			//creo preparedStatement, seteo parametros y ejecuto la consulta.
			PreparedStatement pstmt;

			DBC=new ConexionBD();
			pstmt = DBC.getConnection().prepareStatement(sel);
			pstmt.setInt(1, idJug);
			pstmt.setInt(2, idJug);
			
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()){
				if(rs.isLast())
					partidas = partidas + Integer.toString(rs.getInt("id"));
				else
					partidas = partidas + Integer.toString(rs.getInt("id"))+ ",";
			}
			
			rs.close();
			pstmt.close();
			
		}catch (SQLException e) {
				e.printStackTrace();
				throw new PersistenciaException("Se ha producido un error al intentar levantar los ids de partidas");
				}finally{
					DBC.desconectar();
					return partidas;
		}	
	}
	
	public String getPartida(int idJug){
		String sel=null, partida = "";
		
		try{
			//Format formatter = new SimpleDateFormat("yyyy-MM-dd");
			//String date = "";
			QrysPartida cons=new QrysPartida();
			
			sel = cons.selectPartJug();
			//creo preparedStatement, seteo parametros y ejecuto la consulta.
			PreparedStatement pstmt;

			DBC=new ConexionBD();
			pstmt = DBC.getConnection().prepareStatement(sel);
			pstmt.setInt(1, idJug);
			pstmt.setInt(2, idJug);
			
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()){
				//date = formatter.format(rs.getDate("fecha"));//+date+","+
				partida = partida + Integer.toString(rs.getInt("id"))+","+
							rs.getDate("fecha").toString()+","+
							rs.getString("mercante")+","+
							rs.getString("pirata")+","+
							rs.getString("ganador")+",";
			}
			
			rs.close();
			pstmt.close();
			
		}catch (SQLException e) {
				e.printStackTrace();
				throw new PersistenciaException("Se ha producido un error al intentar levantar la partida");
				}finally{
					DBC.desconectar();
					return partida;
		}	
		
	}
	
	public String getParametros(){
		String sel=null, parametros = "";
		
		try{
			//Format formatter = new SimpleDateFormat("yyyy-MM-dd");
			//String date = "";
			QrysPartida cons=new QrysPartida();
			
			sel = cons.selectParametros();
			//creo preparedStatement, seteo parametros y ejecuto la consulta.
			PreparedStatement pstmt;

			DBC=new ConexionBD();
			pstmt = DBC.getConnection().prepareStatement(sel);
			
			ResultSet rs = pstmt.executeQuery();
			while(rs.next()){
				//date = formatter.format(rs.getDate("fecha"));//+date+","+
				parametros = Integer.toString(rs.getInt("velocidad"))+","+
							rs.getDate("alcance").toString()+","+
							rs.getString("visibilidad");
			}
			
			rs.close();
			pstmt.close();
			
		}catch (SQLException e) {
				e.printStackTrace();
				throw new PersistenciaException("Se ha producido un error al intentar cargar los parametros");
				}finally{
					DBC.desconectar();
					return parametros;
		}	
		
	}
	
	public void setGanador(int id , int idGanador) throws PersistenciaException{
		String ins=null;
		try {
			QrysPartida con = new QrysPartida();
			ins = con.updateGanador();
			PreparedStatement pstmt1;
			DBC = new ConexionBD();
			pstmt1 = DBC.getConnection().prepareStatement(ins);

			pstmt1.setInt(1, id);
			pstmt1.setInt(2, idGanador);
			
			pstmt1.executeUpdate();
			//cierro preparedStatement.
			pstmt1.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new PersistenciaException("Se ha producido un error al intentar guardar la partida");
		}finally{
			DBC.desconectar();
		}	
	}
	/*
	public Partida[] getPartidas(){
		String sel=null;
		String selCoun = null;
		Partida p = new Partida();
		int cant = 0, cont = 0;
		Date d = new Date(1990, 1, 1); //Arreglarlo


		try{
			DBC=new ConexionBD();
			
			QrysPartida cons = new QrysPartida();
			selCoun = cons.selectCantPart();
			sel = cons.selectPartidas();
			
			PreparedStatement pstmtCant;
			PreparedStatement pstmt;
			
			pstmtCant = DBC.getConnection().prepareStatement(selCoun);
			pstmt = DBC.getConnection().prepareStatement(sel);
			
			ResultSet rs = pstmtCant.executeQuery();
			while(rs.next()){
				cant = rs.getInt("cantP");
			}
			
			parts = new Partida[cant];
			
			ResultSet rs2 = pstmt.executeQuery();
			while(rs2.next()){
				p.setId(rs2.getInt("id"));
				p.setFecha(d);
				p.setIdJugador1(rs2.getInt("mercante"));
				p.setIdJugador2(rs2.getInt("pirata"));
				p.setIdGanador(rs2.getInt("id_ganador"));
				
				parts[cont] = p;
				cont++;
			}
			
			rs.close();
			rs2.close();
			pstmtCant.close();
			pstmt.close();
			
	}catch (SQLException e) {
		e.printStackTrace();
		throw new PersistenciaException("Se ha producido un error al intentar levantar las partidas");
		}finally{
			DBC.desconectar();
			return parts;
			}	
		}*/

}
